package com.ys.io.作业;

import java.io.*;
import java.net.URI;
import java.net.URL;

/**
 * 描述: 下载网络资源工具类
 *
 * @author CodeYang
 * @version 2021/1/2 19:56
 */
public class DownResource {

    /**
     * 从网络下载资源到本地
     * 1 从网络下载资源到内存
     * 1. 创建URL对象
     * 2.打开URL对应的流对象,获取输入流
     * 3.定义字节数组读取长度
     * 4.从服务器读取数据将数据写入内存流
     * 2 将数据写入磁盘
     * 1拼接路径
     * 2将内存流数据西路本地磁盘
     *
     * @param urlPath 网络资源对应的路径
     */
    public static void down(String urlPath) throws Exception {
        // 1: 将数据下载到内存
        byte[] data = formNetDownResouce(urlPath);
        // 2: 保存资源 重命名保持名称不重复
        long prefix = System.currentTimeMillis();
        // 截取后缀
        String suffix = urlPath.substring(urlPath.lastIndexOf("."));
        // 新完整路径
        String newPath = "day_23/" + prefix + suffix;
        //持久化到磁盘
        saveDisk(newPath, data);
    }


    /**
     * 保存数据到磁盘
     *
     * @param newPath
     * @param data
     */
    private static void saveDisk(String newPath, byte[] data) throws Exception {
        try (
                OutputStream fos = new FileOutputStream(newPath);

        ) {
            fos.write(data);
        }
    }

    /**
     * 从网络下载资源
     *
     * @param urlPath
     * @return
     */
    private static byte[] formNetDownResouce(String urlPath) throws Exception {
        URI uri = new URI(urlPath);
        URL url = uri.toURL();
        try (   // 1 url 打开网络流 返回一个输入流
                InputStream in = url.openStream();
                // 2 写入内存
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                // 使用缓冲流来写到内存中
                BufferedOutputStream boss = new BufferedOutputStream(bos);

        ) {
            byte[] data = new byte[1024];
            int len = 0;
            while ((len = in.read(data)) != -1) {
                boss.write(data, 0, len);

            }
            boss.flush();
            return bos.toByteArray();
        }

    }

}
